package ar.com.uade.administradorsiembra.persistencia;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import ar.com.uade.administradorsiembra.common.ContextoTransaccional;
import ar.com.uade.administradorsiembra.modelo.ItemCosecha;
import ar.com.uade.administradorsiembra.modelo.Lote;
import ar.com.uade.administradorsiembra.modelo.exceptions.TransaccionException;

public class ItemCosechaMapper extends Mapper<ItemCosecha> {
	
	LoteMapper loteMapper;
	
	public ItemCosechaMapper() {
		loteMapper = new LoteMapper();
	}

	@Override
	public boolean guardarTodos(List<ItemCosecha> instancias)
			throws TransaccionException {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public boolean guardar(ItemCosecha instancia) throws TransaccionException {
		
		int resultado = 0;
		this.logger.info("Guardando el siguiente itemcosecha: " + instancia);
		
		if(instancia.getId() != null){
			ContextoTransaccional contexto = null;
			
			try {
				contexto = super.administradorTransaccional.crearContexto(true);			
				
				String query = "INSERT INTO ItemCosecha (idLote, idCosecha,cantidadCosechada) VALUES (?,?,?)";		
				List<Object> parametros = new ArrayList<Object>();
				
				parametros.add(instancia.getLote().getId());
				parametros.add(instancia.getIdCosecha());
				parametros.add(instancia.getCantidadCosechada());
				
				try {
					resultado = this.executeUpdate(query, parametros, contexto.getConexionActual());
					this.logger.info("Se guardo el itemcosecha en forma exitosa.");
				} catch (SQLException e) {
					this.logger.error("Error al guardar el itemcosecha. " + e.getMessage());
				}
			} catch (TransaccionException te) {
				this.logger.error("Error al guardar el itemcosecha. " + te.getMessage());
			} finally {
				contexto.liberarConexion();
			}
			
			return resultado > 0;
		}
		else{
			return this.modificar(instancia);
		}
	}

	@Override
	public boolean modificar(ItemCosecha instancia) throws TransaccionException {
		
		this.logger.error("Voy a modificar el instancia: " + instancia);
		
		int resultado = 0;
		ContextoTransaccional contexto = null;
		
		try {
			contexto = super.administradorTransaccional.crearContexto(true);
			
			String query = "UPDATE ItemCosecha SET  idLote  = ? , idCosecha  = ? , cantidadCosechada  = ? WHERE id = ?";
			List<Object> parametros = new ArrayList<Object>();
			
			parametros.add(instancia.getLote().getId());
			parametros.add(instancia.getIdCosecha());
			parametros.add(instancia.getCantidadCosechada());
			parametros.add(instancia.getId());
			
			try {			
				resultado = this.executeUpdate(query, parametros, contexto.getConexionActual());					
			} catch (SQLException e) {
				this.logger.error("Error al modificar el instancia. " + e.getMessage());
			}
		} catch (TransaccionException te) {
			this.logger.error("Error al buscar el instancia. " + te.getMessage());
		} finally {
			contexto.liberarConexion();
		}	
		
		return resultado > 0;
	}

	@Override
	public boolean borrar(ItemCosecha instancia) throws TransaccionException {
	
		this.logger.error("Borrando el instancia: " + instancia);
		
		int resultado = 0;
		ContextoTransaccional contexto = null;
		
		try {
			contexto = super.administradorTransaccional.crearContexto(true);
			
			String query = "DELETE FROM ItemCosecha WHERE id = ?";		
			List<Object> parametros = new ArrayList<Object>();
			
			parametros.add(instancia.getId());
			
			try {		
				resultado = this.executeUpdate(query, parametros, contexto.getConexionActual());				
			} catch (SQLException e) {
				this.logger.error("Error al borrar el instancia. " + e.getMessage());
			}
		} catch (TransaccionException te) {
			this.logger.error("Error al buscar el instancia. " + te.getMessage());
		} finally {
			contexto.liberarConexion();
		}
	
		return resultado > 0;
		
	}

	@Override
	public List<ItemCosecha> buscarTodos() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public ItemCosecha buscarPorId(Integer id) {
		// TODO Auto-generated method stub
		return null;
	}
	
	
	public List<ItemCosecha> buscarPorIdCosecha(Integer id) {
		
		this.logger.info("Buscando todos los minerales");
		
		List<ItemCosecha> resultado = new ArrayList<ItemCosecha>();
		ContextoTransaccional contexto = null;
		
		try {
			contexto = super.administradorTransaccional.crearContexto(true);			
			
			String query = "SELECT id, idLote, idCosecha, cantidadCosechada  FROM ItemCosecha where idCosecha = ?";
			List<Object> parametros = new ArrayList<Object>();
			parametros.add(id);
			ResultSet rs;
			
			try {
				
				rs = this.executeQuery(query, parametros, contexto.getConexionActual());
				
				while(rs.next()){
					Lote lote = this.loteMapper.buscarPorId(rs.getInt("idLote"));
					ItemCosecha itemCosecha = new ItemCosecha(rs.getInt("id"),lote, rs.getFloat("cantidadCosechada"), rs.getInt("cantidadCosechada") );
					resultado.add(itemCosecha);
					this.logger.info("ItemCosecha encontrado: " + itemCosecha);
				}			
			} catch (SQLException e) {
				this.logger.error("Error al buscar el ItemCosecha. " + e.getMessage());
			}
		} catch (TransaccionException te) {
			this.logger.error("Error al buscar el ItemCosecha. " + te.getMessage());
		} finally {
			contexto.liberarConexion();
		}
		
		return resultado;
	}
	

}
